此篇要說明的是StoreProcedure,中文是預儲程序,MSDN的說明:
在 SQL Server 2008 R2 中建立 Transact-SQL 或 Common Language Runtime (CLR) 預存程序。預存程序類似於其他程式設計語言中的程序,這些程序可以:
接受輸入參數,並以輸出參數的形式將多個數值傳回呼叫程序或批次處理。
包含可在資料庫中執行作業的程式陳述式,包括呼叫其他程序。
將狀態值傳回呼叫程序或批次處理,以指示成功或失敗 (及失敗原因)。
使用此陳述式在目前的資料庫中建立永久程序,或在 tempdb 資料庫中建立暫存程序。
簡而言之,就是預先儲存在資料庫的執行程序,包含商業邏輯的處理,因此,他類似程式對系統的資料流處理,但要做在程式端,或是資料庫端,都可以,但StoreProcedure安全性高、效能好,也看過有的系統中,是沒有任何SQL的,所有與資料庫的互動,全都透過StoreProcedure,因此會在資料庫中建立相當多的StoreProcedure,這也是一種開發架構,但是程式在DEBUG時,會比較不方便,因為DEBUG下中斷點,無法看到完整的SQL,有時還是要回到資料庫端去找問題,因此也說明了,沒有百分之百所謂最好的架構,任何一種技術都有優點也有缺點.
下列舉個簡單的例子,是從EXCEL讀取資料,並透過StoreProcedure來完成
CREATE PROCEDURE FromExcel
AS
declare @F1 nvarchar(255) , @F2 float, @F3 float
declare test_cursor cursor for
SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','Data Source=C:\book1.xls;Extended Properties=Excel 8.0')...[Sheet1$]
open test_cursor
fetch next from test_cursor into @F1,@F2,@F3
while @@fetch_status=0
begin
if (@F1<>'') begin
update test set LV_PR=@F2,COS_R1=@F3 where (ORD_NO=@F1)
end
fetch next from test_cursor into @F1,@F2,@F3
end
close test_cursor
deallocate test_cursor
各種不同的系統因為開發的架構不一樣,但StoreProcedure存在的機率很高,特別是接手客戶端的維護系統時,千奇百怪的做法都有,當然也少不了StoreProcedure,因此即使不會建立,也要能看得懂,或做修改,才能進一步維護
另外ASP.NET有以C#去撰寫StoreProcedure,再註冊回資料庫的方法,避免StoreProcedure的語法比較不直覺,因此工程師可以用熟悉的C#去做,寫法和一般的ADO.NET差不多,這也是另一個解決方案,當對StoreProcedure的語法不熟悉時,至少可以用C#去寫,再把StoreProcedure編譯後,註冊回資料庫.